package com.example.demo.service.impl;

import java.time.LocalDateTime;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import com.example.demo.dto.AddRequestDto;
import com.example.demo.dto.DeleteResponseDto;
import com.example.demo.dto.DetailRequestDto;
import com.example.demo.dto.DetailResponseDto;
import com.example.demo.dto.EditRequestDto;
import com.example.demo.dto.InfoRequestDto;
import com.example.demo.dto.InfoResponseDto;
import com.example.demo.entity.AuthorityEnity;
import com.example.demo.mapper.AuthorityInfoMapper;
import com.example.demo.service.AuthorityService;

/**
 * 権限管理 サービス
 */
@Service
public class AuthorityServiceImpl implements AuthorityService {

    @Resource
    private AuthorityInfoMapper authorityInfoMapper;

    /**
     * 権限削除
     *
     * @param requestDto
     * @return DeleteResponseDto
     */
    @Override
    public DeleteResponseDto authorityRemoval(String authorityCode, boolean deletionFlag) {

        // 削除の結果を取得します
        Integer permissionRemoval = authorityInfoMapper.authorityRemoval(authorityCode, deletionFlag);
        // 結果判定
        DeleteResponseDto responseDto = new DeleteResponseDto();
        if (permissionRemoval == 1) {
            responseDto.setProcessingResult("1");
        } else {
            responseDto.setProcessingResult("0");
        }
        return responseDto;
    }

    /**
     * 権限情報を取得表示する
     *
     * @param requestDto
     * @return DeleteResponseDto
     */

    @Override
    public InfoResponseDto authorityInfo(InfoRequestDto inforequestDto) {
        // 権限情報を取得する
        List<AuthorityEnity> resultList = authorityInfoMapper.authorityInfo(inforequestDto);
        // 検索結果判定
        InfoResponseDto infoResponseDto = new InfoResponseDto();
        if (resultList != null && resultList.size() == 1) {
            BeanUtils.copyProperties(resultList.get(0), infoResponseDto);
            infoResponseDto.setProcessingResult("1");
        } else {
            infoResponseDto.setProcessingResult("0");
        }
        return infoResponseDto;
    }

    /**
     * 権限情報を取得表示する
     *
     * @param requestDto
     * @return Integer
     */
    @Override
    public Integer select(EditRequestDto requestDto) {
        // 権限情報を取得表示する
        AuthorityEnity authority = authorityInfoMapper.selectByCode(requestDto);
        if (authority != null) {
            requestDto.setProcessingResult("1");
            return 1;
        } else {
            requestDto.setProcessingResult("0");
            return 0;
        }
    }

    /**
     * 権限情報を編集する
     *
     * @param requestDto
     * @return Integer
     */
    @Override
    public Integer updateAuthority(EditRequestDto requestDto) {
        LocalDateTime time = LocalDateTime.now();
        requestDto.setUpdateDate(time);
        requestDto.setUpdater("liu");
        requestDto.setCompanyCode("001");
        Integer code = authorityInfoMapper.updateByCode(requestDto);
        return code;
    }


    /**
     * 権限情報を取得表示する
     *
     * @param requestDto
     * @return Integer
     */

    public DetailResponseDto detail(DetailRequestDto requestDto) {
        // 権限情報を取得する
        List<AuthorityEnity> resultList = authorityInfoMapper.detail(requestDto);
        // 検索結果判定
        DetailResponseDto infoResponseDto = new DetailResponseDto();
        if (resultList != null && resultList.size() == 1) {
            BeanUtils.copyProperties(resultList.get(0), infoResponseDto);
            infoResponseDto.setProcessingResult("1");
        } else {
            infoResponseDto.setProcessingResult("0");
        }
        return infoResponseDto;
    }

    /**
     * 権限を新規する
     *
     * @param addRequestDto
     * @return Integer
     */
    @Override
    public Integer add(AddRequestDto addRequestDto) {

        // コードを取得する
        Integer maxCode = selectMaxCode();
        maxCode++;

        // 業務判断
        if (addRequestDto.getAuthorityCode().equals(String.valueOf(maxCode))) {

            // 権限情報を追加する
            addRequestDto.setCompanyCode(addRequestDto.getAuthorityCode());
            Integer result = authorityInfoMapper.addAuthority(addRequestDto);

            // で追加成功の場合
            return result;
        }

        //結果を返します
        return maxCode;
    }

    /**
     * コードを取得する
     *
     * @param
     * @return Integer
     */
    @Override
    public Integer selectMaxCode() {

        //クエリ最大コードです
        Integer maxCode = authorityInfoMapper.selectMaxCode();

        //結果を返します
        return maxCode;
    }
}
